package atguigu.java;

/**
 * 多线程的创建
 * 方式一：继承于 Thread 类
 * 1.创建一个继承于 Thread 类的子类
 * 2.重写 Thread 类的 run()方法
 * 3.创建 Thread 类的子类的对象
 * 4.通过此对象调用 start()
 * 举例：遍历100以内的偶数
 *
 * 5.yield()： 释放当前 cpu 的执行权
 * 6.join()： 在线程 A 中调用线程 B 的 join 方法，此时线程 A 进入了阻塞状态，直到线程 B 完全执行完以后，线程 A 才结束阻塞状态。
 * 7.stop()： 已过时。当执行此方法时，强制结束当前线程
 * 8.sleep(long millis)：让当前线程 睡眠指定的 millis 毫秒。在指定的 millis 毫秒时间内，当前线程是阻塞状态
 * 9.isAlive()：判断当前线程是否存活
 *
 * 线程的优先级：
 *         Thread.MAX_PRIORITY 10 最高优先级
 *         Thread.MIN_PRIORITY 1 最低优先级
 *         Thread.NORM_PRIORITY 5 默认优先级
 * 如何获取线程的优先级？
 *         getPriority();
 * 如何设置线程的优先级？
 *          setPriority(int newPriority);
 * 说明：高优先级的线程要抢占低优先级线程 cpu 的执行权，但是只是从概率上面讲，高优先级的线程高概率情况下会被执行。并不意味着优先级越高越先被执行
 * @Description
 * @Author codingBee
 * @Date 2020/8/19/22:11
 */
public class ThreadTest {
    public static void main(String[] args) {
        //3.创建 Thread 类的子类的对象
        MyThread myThread = new MyThread();
        //4.通过此对象调用 start()；①.启动当前线程②.调用当前线程的 run()
        myThread.start();
        //问题一：不能直接通过线程调用run()的方式启动线程
//        myThread.run();
//        问题二：再启动一个线程，遍历100以内的偶数。不可以让已经 start() 的线程去执行。否则会报 IllegalThreadStateException
//        myThread.start();
        //需要重新创建一个线程对象
        MyThread myThread2 = new MyThread();
        myThread2.start();
        //下面操作还是在主线程中执行的
        System.out.println(Thread.currentThread().getName()+":"+"hello");
    }
}

//1.创建一个继承于 Thread 类的子类
class MyThread extends Thread {
    //2.重写 run()方法
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}
